import requests
import json
import os
import requests
from urllib.parse import urlparse
from PIL import Image
import re
from shutil import copyfile
import time
import subprocess
from pathlib import Path
from datetime import datetime
from flask import Flask, request, jsonify
from urllib.parse import urlparse
from pathlib import Path



# 字符串转JSON
def convert_to_json(input_list,keyword,fileword):
    result = []
    for i, url in enumerate(input_list, start=1):
        item = {
            "sn": i,
            "url": url,
            "file_key_word": keyword,
            "file_word": fileword
        }
        result.append(item)
    return json.dumps(result,ensure_ascii=False)


# 保存文件到本地目录
def download_and_save_mp4(mp4_url, target_dir):
    # 确保目标目录存在
    target_path = Path(target_dir)
    target_path.mkdir(parents=True, exist_ok=True)

    # 检测文件是否存在
    try:
        response = requests.head(mp4_url, allow_redirects=True)
        if response.status_code != 200:
            print(f"无法访问文件: {mp4_url}")
            return False
    except requests.RequestException as e:
        print(f"请求出错: {e}")
        return False

    # 删除指定目录下的全部文件
    for file in target_path.glob('*'):
        if file.is_file():
            file.unlink()

    # 获取当前时间的纳秒部分
    current_time = datetime.now()
    nanosecond_part = current_time.strftime('%f')  # 微秒部分，6位数字
    filename = f'{nanosecond_part}.mp4'

    # 下载文件并保存为带有纳秒的时间戳命名的文件
    try:
        mp4_content = requests.get(mp4_url, stream=True).content
        with open(target_path / filename, 'wb') as f:
            f.write(mp4_content)
        print("文件下载完成")
        return True
    except Exception as e:
        print(f"下载文件时出错: {e}")
        return False




def run_shell_script(script_path):
    """
    执行指定的 shell 脚本。

    参数:
    - script_path: 要执行的 shell 脚本的路径。

    返回:
    - 一个包含脚本执行结果的对象。
    """
    try:
        # 使用 subprocess.run 执行 shell 脚本
        result = subprocess.run(
            [script_path],  # 要执行的命令和参数
            capture_output=True,  # 捕获标准输出和标准错误
            text=True,  # 将输出作为文本而不是字节
            check=True  # 如果命令返回非零退出状态，则引发 CalledProcessError
        )

        # 打印标准输出
        print("标准输出1111111111:")
        print(result.stdout)

        # 打印标准错误
        if result.stderr:
            print("标准错误:")
            print(result.stderr)

        return result
    except subprocess.CalledProcessError as e:
        print(f"脚本执行失败: {e}")
        print(f"标准错误: {e.stderr}")
        return e

def extract_timestamp(url):
    """
    从给定的 URL 中提取时间戳。

    参数:
    - url: 包含时间戳的 URL 字符串。

    返回:
    - 提取的时间戳字符串。
    """
    # 使用正则表达式匹配时间戳
    match = re.search(r'/(\d+:\d+:\d+)\.png$', url)

    if match:
        # 如果找到匹配项，返回时间戳
        return match.group(1)
    else:
        # 如果没有找到匹配项，返回 None 或抛出异常
        raise ValueError("URL 中未找到时间戳")

# 示例 URL
url = "http://172.16.173.114:6606/ve_batches/fa8f0424-2acc-4366-be9c-220271d5a3ac/all_images/test1.mp4/http://172.16.173.114:6606/ve_batches/fa8f0424-2acc-4366-be9c-220271d5a3ac/all_images/test1.mp4/0:11:19.png"

# 调用函数并打印结果
try:
    timestamp = extract_timestamp(url)
    print(f"提取的时间戳: {timestamp}")
except ValueError as e:
    print(e)





def transform_url(original_url):
    # 定义新的 IP 地址和端口号
    new_ip_with_port = "172.16.173.114:6606"

    # 替换 IP 地址
    transformed_url = original_url.replace("http://127.0.0.1", f"http://{new_ip_with_port}")

    # 在路径末尾添加 .png 扩展名
    if not transformed_url.endswith(".png"):
        transformed_url += ".png"

    return transformed_url

    # 示例字符串
    original_url = "http://127.0.0.1/ve_batches/ade280d3-5c2e-4a0f-9dd3-b15c9a864a9f/all_images/wang_dog.mp4/0:02:01"

    # 转换 URL
    transformed_url = transform_url(original_url)

    return transformed_url

def send_to_split_user_info(target_url, keywords):
    #  发送数据到AI接口
    """
    发送一个包含关键词的POST请求到指定的URL。

    参数:
        target_url (str): 目标服务器的URL。
        keywords (dict): 包含关键词的字典。

    返回:
        response: 服务器返回的响应对象。
    """
    try:
        # 将关键词字典转换为JSON格式字符串
        payload = json.dumps(keywords)

        # 设置请求头，指明这是一个JSON请求
        headers = {
            'Content-Type': 'application/json'
        }

        # 发送POST请求
        response = requests.post(target_url, data=payload, headers=headers)

        # 检查请求是否成功
        if response.status_code == 200:
            print("请求成功")
        else:
            print(f"请求失败，状态码：{response.status_code}")

        return response

    except requests.exceptions.RequestException as e:
        # 请求出错处理
        print(f"请求出错: {e}")
        return None





def send_post_request_list(url, data):
    """
    发送 HTTP POST 请求并处理返回的数据。

    参数:
    - url: 目标 URL。
    - data: 要发送的 JSON 数据。

    返回:
    - 如果请求成功，返回前三个 URL 的值。
    - 如果请求失败或发生错误，返回错误信息。
    """
    # 将数据转换为 JSON 格式
    json_data = json.dumps(data)

    # 设置请求头
    headers = {
        'Content-Type': 'application/json'
    }

    try:
        # 发送 POST 请求
        response = requests.post(url, data=json_data, headers=headers)

        # 检查响应状态码
        if response.status_code == 200:
            # 解析返回的 JSON 数据
            response_data = response.json()

            # 提取前三个 URL
            urls = [item['url'] for item in response_data[:9]]
            return urls
        else:
            # 返回错误信息
            error_message = f"请求失败，状态码: {response.status_code}\n响应内容: {response.text}"
            return error_message
    except requests.exceptions.RequestException as e:
        # 返回请求异常信息
        return f"请求发生错误: {e}"


def send_post_request(url, data):
    """
    发送 HTTP POST 请求并处理返回的数据。

    参数:
    - url: 目标 URL。
    - data: 要发送的 JSON 数据。

    返回:
    - 如果 status 为 true，返回 batch_id。
    - 如果 status 不为 true，返回出错信息。
    """
    # 将数据转换为 JSON 格式
    json_data = json.dumps(data)

    # 设置请求头
    headers = {
        'Content-Type': 'application/json'
    }

    try:
        # 发送 POST 请求
        response = requests.post(url, data=json_data, headers=headers)

        # 检查响应状态码
        if response.status_code == 200:
            # 解析返回的 JSON 数据
            response_data = response.json()

            # 检查 status 是否为 true
            if response_data.get('status', False):
                return response_data['batch_id']
            else:
                return "出错信息: " + json.dumps(response_data)
        else:
            return f"请求失败，状态码: {response.status_code}\n响应内容: {response.text}"
    except requests.exceptions.RequestException as e:
        return f"请求发生错误: {e}"


# 示例使用
def generate_images_and_captions(video_file,keyword,fileword):
  # 上传文件 建议增加 删除1 原来目录2 下载文件 3 转码
  download_and_save_mp4(video_file, "/var/www/html/data")
  word_list = []
  #判断是否重复的文件
  if  2>1 :
    #  启动服务
    run_shell_script("/data/tools/clip/clipdemo/run.sh")
    time.sleep(10)  # 暂停执行 2 秒
    analyse_url = 'http://172.16.173.114:6603/video_analyse'  # 替换为实际的目标 URL
    analyse_data = {
        "remote_dir": "chs_xfun_video/cartoon",
        "ftp_server": "127.0.0.1",
        "username": "ftpuser",
        "password": "123456"
    }

    # 调用函数发送 POST 请求
    result = send_post_request(analyse_url, analyse_data)
    #print(result)
    # 判断返回值是否为错误信息
    if "出错信息" in result or "请求失败" in result or "请求发生错误" in result:
        print(f"analyse_url 发生了错误:{result} ")
    else:
        print(f"analyse_url  成功获取 batch_id:{result}  ")




    service_url = 'http://172.16.173.114:6604/start_service'  # 替换为实际的目标 URL
    service_data = {
        "id": 1,
        "batch_id": result
    }

    # 调用函数发送 POST 请求
    result = send_post_request(service_url, service_data)
    #print(result)
    # 判断返回值是否为错误信息
    if "出错信息" in result or "请求失败" in result or "请求发生错误" in result:
        print(f"service_url 发生了错误:{result} ")

    else:
        print(f"service_url  成功获取 batch_id:{result}  ")

    knn_url = 'http://172.16.173.114:6605/knn-service'  # 替换为实际的目标 URL
    knn_data = {
        "text": keyword,
        "image": None,
        "image_url": None,
        "embedding_input": None,
        "deduplicate": True,
        "use_safety_model": False,
        "use_violence_detector": False,
        "indice_name": None,
        "use_mclip": False,
        "aesthetic_score": 9,
        "aesthetic_weight": 0.5,
        "modality": "image",
        "num_images": 30,
        "num_result_ids": 30
    }
    
   # 调用函数发送 POST 请求
    result = send_post_request_list(knn_url, knn_data)
   # 定义字典
    string_array = []
    if isinstance(result, list):
        print("前三个 URL 的值:")
        for i, url in enumerate(result, start=1):
           # print(f"URL {i}: {url}")
           # print(transform_url(url))
           #  下载文件到本地
           pic_url  = transform_url(url)
           print(pic_url)
           string_array.append(pic_url) 

    else:
        print("发生了错误:")
        print(result)
    

    str1 = convert_to_json(string_array,keyword,fileword)
    return  str1
   
app = Flask(__name__)

@app.route('/postdata', methods=['POST'])
def post_data():
    try:
        # 获取JSON数据
        data = request.get_json()

        # 检查必要字段是否存在
        if not data or 'file_url' not in data or 'file_key_word' not in data:
            return jsonify({'error': 'Invalid JSON format: "file_url" and "file_key_word" are required'}), 400

        file_url = data.get('file_url')
        file_key_word = data.get('file_key_word')
        file_word = data.get('file_word')
        print(file_url,file_key_word,file_word)
        str1 =generate_images_and_captions(file_url,file_key_word,file_word)
        # 在这里可以添加处理逻辑，例如调用其他函数处理file_url和file_key_word
        # 返回成功的响应
        response = {
            'status': 'success',
            'message': 'Data received successfully',
            'received_file_url': file_url,
            'received_file_key_word': file_key_word,
            'received_data':str1

        }
        return str1, 200

        #return jsonify(response), 200
    except Exception as e:
        return jsonify({'error': str(e)}), 500

@app.route('/receive_user_info', methods=['POST'])
def receive_data():
    # 从请求中获取 JSON 数据
    data = request.get_json()
    if data:
        file_url = data.get('file_url')
        file_key_word = data.get('file_key_word')
        file_word = data.get('file_word')
        #  发送数据分解数据
        response = send_to_split_user_info('http://172.16.0.9:5001/split_user_info',data)
        print('http://172.16.0.9:5001/split_user_info',data)
        if response is not None:
        # 打印服务器返回的内容
           response_json = response.json()
           print(json.dumps(response_json, ensure_ascii=False, indent=2))

           



        return jsonify({"message": "Data received successfully"}), 200
    else:
        return jsonify({"error": "Invalid data format. Expected JSON."}), 400






if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)  # 监听所有可用网络接口，并在5000端口上运行

